package com.ajax;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

/**
 * @author wzm
 * @create 2023-05-13 14:50
 */
public class BaseServlet extends HttpServlet {
    //重写父类的Service方法就会优先执行  其他子类继承该类会直接访问该类的service方法
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //在这调用子类的方法 且该方法是子类特有的  用反射
        //？获取到子类的字节文件 this this就是调用Service的子类方法且谁调就是谁
        
        //0.根据请求获取请求地址
        String uri = req.getRequestURI();//  /javaweb12/user/login
//        System.out.println("uri = " + uri);
        //0.1 通过路径截取方法名
        String methodName = uri.substring(uri.lastIndexOf('/')+ 1);//login
        System.out.println("methodName = " + methodName);

        //1.获取子类的对象用于反射获取需要执行的方法
        Class<? extends BaseServlet> cla = this.getClass();

        //2.想要获取子类执行的方法 (方法可能不是公开的)
        try {
            Method method = cla.getDeclaredMethod(methodName,HttpServletRequest.class,HttpServletResponse.class);
            method.setAccessible(true);//非public方法可以访问

            //调用方法
                method.invoke(this,req,resp);
        } catch (NoSuchMethodException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            e.printStackTrace();
        }


    }

}
